
#ifndef _LLIST_H
#  define _LLIST_H

#  include <pthread.h>
#  include <string.h>
#  include <stdlib.h>
#  include <stdint.h>

#  include <config.h>

#  ifdef _PHYSM_PROC_x86_64
typedef uint64_t llist_data_t;
#  else
typedef uint32_t llist_data_t;
#  endif

typedef struct _llist_bucket {

  struct _llist_bucket *next;
  llist_data_t data;

} llist_bucket_t;

typedef struct _llist_t {

  llist_bucket_t start;
  pthread_mutex_t lock;

} llist_t;

#  define LLIST_TRAV(list, elem)		\
  for (elem = ((llist_bucket_t *) list)->next; elem != NULL; elem = elem->next)

/* Some functions. */

llist_data_t     llist_add(llist_t *, llist_data_t);
llist_data_t     llist_get(llist_t *, int);
llist_data_t     llist_lock_get(llist_t *, int);
llist_data_t     llist_del(llist_t *, int);
int              llist_len(llist_t *);
void             llist_init(llist_t *);

/* Some internal functions */
llist_bucket_t *_llist_make_bucket(llist_data_t);
void            _llist_destroy_bucket(llist_bucket_t *);

#endif
